#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

// void *Func_Thread1(void *arg)
// {
//     static int return_value=109;
//     printf("i am thread1!\n");
//     sleep(2);
//     return &return_value;
// }

void cleanup(void *arg)
{
    free((char*)arg);
    printf("clear arg success!\n");
}

void *Func_Thread1(void *arg)
{
    int num=0;
    char *ptr=(char *)malloc(100);
    pthread_cleanup_push(cleanup,ptr);
    while(1)
    {
        printf("thread 1 is running!\n");
        sleep(1);
        num++;
        if(num==5)
        {
            // pthread_exit(&num);
            break;
        }       
    }
    printf("ready to cleanup pthread\n");
    pthread_cleanup_pop(1);
    return NULL;
}

void *Func_Thread2(void *arg)
{
    int *a=(int *)arg;
    while(1)
    {
        printf("i am thread2!a:%d\n",*a);
        sleep(1);
    }
}

int main()
{
    int a=10;
    pthread_t thread1,thread2;
    pthread_create(&thread1,NULL,Func_Thread1,(void *)&a);

    pthread_create(&thread2,NULL,Func_Thread2,(void *)&a);

    sleep(5);
    printf("main: a:%d\n",a);
    while(1);
    
    void *value;
    pthread_join(thread1,&value);
    printf("thread1 return value: %d\n",*((int *)value));

    pthread_detach(thread1);

//     sleep(5);
//     pthread_cancel(thread1);
//     void *value;
//     pthread_join(thread1,&value);
// 
//     printf("return value:%d\n",*((int*)value));

    return 0;   
}


// int main()
// {
//     int a=10;
//     pthread_t thread1,thread2;
//     pthread_create(&thread1,NULL,Func_Thread1,(void *)&a);
// 
//     sleep(2);
//     pthread_cancel(thread1);
//     while(1);
//     return 0;   
// }